#ifndef __SQSTACK_H__
#define __SQSTACK_H__

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//类型的声明
//假设栈中的元素类型是int 
typedef int Datatype;

#define MAX_NUM 1024

//顺序栈结构
typedef struct Sqstack
{
    //栈元素的存储空间
    //Elemtype data[MAX_NUM];
    Datatype *data; //在初始化的时候,再给他分配空间

    //栈顶下标
    int top;    //表示栈顶元素在data中的下标,当栈中没有元素

}Sqstack;

//函数的声明

/*
InitStack:初始化一个空栈,分配一个栈
返回值:返回一个初始化好的栈的地址
*/
Sqstack *InitStack();

/*
DestoryStack:销毁一个栈
@s:指向你要销毁的栈
返回值:无
*/
void DestoryStack(Sqstack *s);

/*
ClearStack:清空一个栈
@s:指向你要清空的栈
返回值:无
*/
void ClearStack(Sqstack *s);

/*
StackIsEmpty:判断栈是否为空(是否存在用户数据)
@s:指向你要操作的栈
返回值:
    如果栈为空,返回真  true 
    如果栈为非空,返回假  false
*/
bool StackIsEmpty(Sqstack *s);

/*
StackSize:获取栈的大小(用户元素的个数)
@s:指向你要操作的栈
返回值:栈中的元素个数
*/
int StackSize(Sqstack *s);

/*
GetTop:获取栈顶元素,但是不出栈
@s:指向你要操作的栈
@v:指向一个可用的空间,用来保存获取到的栈顶元素
返回值:表示获取成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool GetTop(Sqstack *s,Datatype *v);

/*
Push:入栈,把一个用户数据存放到栈中去
@s:指向你要操作的栈
@e:你要入栈的元素
返回值:表示入栈成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool Push(Sqstack *s,Datatype e);

/*
Pop:出栈,把一个用户数据从栈中拿出来
@s:指向你要操作的栈
返回值:表示出栈成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool Pop(Sqstack *s);

#endif